package com.satoken.config;

import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册 Sa-Token 拦截器，定义详细认证规则
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 指定一条 match 规则
            SaRouter
                    .match("/**")    // 拦截的 path 列表，可以写多个 */
                    .notMatch("/user/doLogin")        // 排除掉的 path 列表，可以写多个
                    .check(r -> StpUtil.checkLogin());        // 要执行的校验动作，可以写完整的 lambda 表达式

            // 根据路由划分模块，不同模块不同鉴权
            // 一般我们设计权限:接口都是判断权限Permission 不去判断角色
            // 功能展示的时候判断角色

            // 进入 free 独立作用域
            SaRouter.match("/center/**").free(r -> {
                SaRouter.match("/center/**",m -> System.out.println("内部1"));
                SaRouter.match("/center/**",m -> System.out.println("内部2")).stop();
                SaRouter.match("/center/**",m -> System.out.println("内部3"));
            });
            // 执行 stop() 函数跳出 free 后继续执行下面的 match 匹配
            SaRouter.match("/center/**",r-> System.out.println("测试-外部"));


            SaRouter.match("/admin/**", r -> StpUtil.checkRole("admin"));

            // 甚至你可以随意的写一个打印语句
            SaRouter.match("/**", r -> System.out.println("----啦啦啦----"));

        }).isAnnotation(false)
        ).addPathPatterns("/**");
    }
}
